package top.soft.windows;

import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JTabbedPane;

import top.soft.inter.Observer;
import top.soft.inter.Subject;
import top.soft.util.CommonData;

/**
 * @ClassName: MainWindow
 * @Author: Amosen
 * @Since: 2021/4/20
 */

// MainWindow既是一个观察者，也是一个主题，它是上层WebSocket客户端的观察者，是下层视图的主题
// 上层WebSocket主题的引用全部由数据中心持有，保证全局WebSocket主题的唯一性
public class MainWindow extends JFrame implements Observer, Subject {
	JTabbedPane tabbedPane;

	// 持有下层观察者的列表
	private List<Observer> observers = new ArrayList<>();

	public MainWindow(JFrame frame) {
		frame.dispose();
		init();
	}

	private void init() {
		// 向主题注册
		this.register();
		// 向数据中心注册
		this.registerToCommonData();

		tabbedPane = new JTabbedPane();
		tabbedPane.addTab(CommonData.TAB_ONE, new ShowView());
		tabbedPane.addTab(CommonData.TAB_TWO, new AddView());
		tabbedPane.addTab(CommonData.TAB_THREE, new UpdateView());
		tabbedPane.addTab(CommonData.TAB_FOUR, new FileView());
		tabbedPane.addTab(CommonData.TAB_FIVE, new ChatView());

		add(tabbedPane);

		// 设置大小
		setSize(600, 600);
		// 设置居中
		setLocationRelativeTo(null);
		// 禁止修改大小
		setResizable(true);
		// 设置关闭行为
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		// 设置可见
		setVisible(true);

		setTitle(CommonData.WINDOW_TITLE);
	}

	private void registerToCommonData() {
		CommonData.setMainWindow(this);
	}

	// 向数据中心的主题引用报告自己需要注册
	@Override
	public void register() {
		// TODO Auto-generated method stub
		CommonData.getWebSocketClient().register(this);
	}

	// 向主题报告将自己移除
	@Override
	public void remove() {
		// TODO Auto-generated method stub
		CommonData.getWebSocketClient().remove(this);
	}

	@Override
	public void acceptAnounce(String message) {
		// TODO Auto-generated method stub
		// 接受消息，将消息发送给聊天视图进行处理
		anounce(message);
	}

	// 这个方法用于告诉观察者自己的引用
	public MainWindow getMainWindow() {
		return this;
	}

	// 发布通知
	@Override
	public void anounce(String message) {
		// TODO Auto-generated method stub
		for (Observer observer : observers) {
			observer.acceptAnounce(message);
		}
	}

	@Override
	public void register(Observer observer) {
		// TODO Auto-generated method stub
		this.observers.add(observer);
	}

	@Override
	public void remove(Observer observer) {
		// TODO Auto-generated method stub
		this.observers.remove(observer);
	}

	public void removeObserver(Observer observer) {
		this.remove(observer);
	}
}
